<?php
namespace Logic\Member;
use Spartan\Lib\Logic;

!defined('APP_PATH') && exit('404 Not Found');

/**
 * 用户的登录或注册
 * Class Auth
 * @package Logic\Member
 */
class Relations extends Logic
{
    /**
     * 填写推荐人用户名得到的推荐关系
     * @return array
     */
    public function addRecommendByUserNameAndEmail(){
        $intUserId = max($this->getRequestValue('user_id'),0);//被推荐人用户ID
        if($intUserId<1){
            return Array('用户ID错误!',0);
        }
        $arrData = Array(
            'recommend_user_name'=>$this->getRequestValue('recommend_user_name',''),
            'recommend_email'=>$this->getRequestValue('recommend_email',''),
            'recommend_mobile'=>$this->getRequestValue('recommend_mobile',''),
        );
        $options = Array(
            'where'=>Array(
                'mobile'=>$arrData['recommend_mobile'],
                'email'=>$arrData['recommend_email'],
                'user_name'=>$arrData['recommend_user_name']
            )
        );
        $arrReferrer =$this->Db()->find('member_auth',$options);
        if (!$arrReferrer){
            return Array('推荐人不存在',0);
        }
        $arrUserName = Array($this->getRequestValue('user_name'),$arrReferrer['user_name']);
        $arrResult = $this->add($intUserId,$arrReferrer['id'],$arrUserName,"填写推荐人进行推荐。");
        if($arrResult[1] !=1 ){
            $arrData = array(
                "level"=>0,
                "class"=>"ReferralServices.addRecommendByEmail",
                "info"=>"添加推荐用户关系失败！被推荐人：{$intUserId},推荐人：{$arrReferrer['id']}",
                "err"=>$this->Db()->getError(),
            );
            $this->sysError($arrData);
            return $arrResult;
        }
        return Array('添加成功。',1,$arrResult);
    }

    /**
     * 推荐码推荐
     * @return array
     */
    public function addRecommendByCode(){
        $intUserId = max(0,$this->getRequestValue('user_id')) ;//用户ID
        $strRecommendCode = trim($this->getRequestValue('recommend_code',''));//推荐码
        $strUserName = $this->getRequestValue('user_name','');
        if($intUserId<1){
            return array('用户ID错误!',0);
        }
        if(mb_strlen($strRecommendCode,'utf-8') != 16){
            return array('推荐码不能为空！',0);
        }
        $options=array(
            'where'=>array(
                'recommend_code'=>$strRecommendCode
            )
        );
        $arrReferrer =$this->Db()->find('member_auth',$options);
        if(!$arrReferrer){
            $arrData = array(
                "level"=>0,
                "class"=>"Logic.Recommend.addRecommendByCode",
                "info"=>"推荐码不存在！",
                "err"=>"被推荐人：{$intUserId},推荐人：{$arrReferrer['id']}",
                "add_time"=>date('Y-m-d H:i:s',time()),
            );
            $this->sysError($arrData);
            return Array('推荐码不存在。',0);
        }
        $intReferrerId = max(0,$arrReferrer['id']);
        $arrUserName = Array($strUserName,$arrReferrer['user_name']);
        $arrResult = $this->add($intUserId,$intReferrerId,$arrUserName,"推荐人通过推荐码进行推荐。");
        if($arrResult[1] != 1 ){
            $arrData = array(
                "level"=>0,
                "class"=>"Logic.Recommend.addRecommendByCode",
                "info"=>"添加推荐用户关系失败！推荐人：{$intReferrerId},被推荐人：{$intUserId}",
                "err"=>$this->Db()->getError(),
            );
            $this->sysError($arrData);
            return Array('添加推荐用户关系失败。',0);
        }
        return Array('添加成功。',1,$arrResult);
    }

    /**
     * 添加一个推荐关系
     * @date 2014-03-31
     * @param int $intUserId 受推荐用户ID
     * @param int $intReferrerId 推荐人用户ID
     * @param array $arrUserName 被推荐人和推荐人
     * @param string $strContent 备注
     * @param int $intStatus 状态
     * @return array
     */
    public function add($intUserId, $intReferrerId,$arrUserName, $strContent='',$intStatus = 1){
        if ($intUserId == $intReferrerId) {
            return Array('无法将用户自己设定为推荐人',0);
        }
        $options = Array(
            'where'=>Array(
                'user_id'=>$intUserId,
            )
        );
        $intCount = $this->Db()->find('member_relations',$options,"count('user_id')");
        if ($intCount > 0) { // 确定是否已存在关系
            return Array('已存在推荐关系',0);
        }
        is_null($strContent) && $strContent = '';
        $arrData = array(
            'user_id'     => $intUserId,
            'user_name'   => '["'.$arrUserName[0].'","'.$arrUserName[1].'"]',//json_encode($arrUserName),
            'referrer_id_1' => $intReferrerId,
            'status'      => $intStatus,//默认
            'remark'      => $strContent,
            'type'        => 1,//默认
            'add_time'    => date('Y-m-d H:i:s',time()),
        );
        //推荐人，带来他的关系
        $options = Array(
            'where'=>Array(
                'user_id'=>$intReferrerId,
            )
        );
        $arrParentInfo = $this->Db()->find('member_relations',$options);
        if ($arrParentInfo){
            for($i = 2;$i <= 10;$i++){
                $arrData["referrer_id_{$i}"] = $arrParentInfo['referrer_id_'.($i-1)];
            }
        }
        $result = $this->Db()->insert('member_relations',$arrData);
        if ($result === false) {
            return Array('写入数据时发生错误',0);
        }else{
            return Array('添加成功',1,$arrData);
        }
    }
    /**
     * 更新一个推荐关系
     * @date 2014-03-31
     * @param int $intUserId 受推荐用户ID
     * @param int $intReferrerId 推荐人用户ID
     * @param array $arrUserName 被推荐人和推荐人
     * @param string $strContent 备注
     * @return array
     */
    public function update($intUserId, $intReferrerId,$arrUserName, $strContent=''){
        if ($intUserId == $intReferrerId) {
            return Array('无法将用户自己设定为推荐人',0);
        }
        $options = Array(
            'where'=>Array(
                'user_id'=>$intUserId,
                'referrer_id_1' => $intReferrerId,
            )
        );
        $count =$this->Db()->find('member_relations',$options,"count('user_id')");
        if ($count > 0) { // 确定是否已存在关系
            return Array('已存在推荐关系，无需修改',0);
        }
        $arrData = array(
            'user_name'   => json_encode($arrUserName,JSON_UNESCAPED_UNICODE),
            'status'      => 1,//默认
            'remark'      => $strContent,
            'type'        => 1,//默认
            'add_time'    => date('Y-m-d H:i:s',time()),
            'user_id'     => $intUserId,
            'referrer_id_1' => $intReferrerId,
        );
        //推荐人，带来他的关系
        $options = Array(
            'where'=>Array(
                'user_id'=>$intReferrerId,
            )
        );
        $arrParentInfo = $this->Db()->find('member_relations',$options);
        if ($arrParentInfo){
            for($i = 2;$i <= 10;$i++){
                $arrData["referrer_id_{$i}"] = isset($arrParentInfo['referrer_id_'.($i-1)])?$arrParentInfo['referrer_id_'.($i-1)]:0;
            }
        }
        //$arrData 等于 当前的整个完整关系
        $this->Db()->startTrans('Recommend.update');
        $options = Array(
            'where'=>Array(
                'referrer_id_1|referrer_id_2|referrer_id_3|referrer_id_4|referrer_id_5|referrer_id_6|referrer_id_7|referrer_id_8|referrer_id_9|referrer_id_10'=>$intUserId,
            )
        );
        $arrParentInfo = $this->Db()->select('member_relations',$options);
        //找出被推荐人在其它层里的关系。
        //顶层的人 TODO
        $intMasterId = max(0,intval(C('OEM_CONFIG.USER_ID')));
        if ($intMasterId < 1){
            return Array('最大顶层老大不存在。'.$intMasterId,0);
        }
        foreach ($arrParentInfo as $v){
            for($i=1;$i<=10;$i++){
                if ($v['referrer_id_'.$i] == $intUserId){
                    for($ii=$i;$ii<=10;$ii++){
                        $v['referrer_id_'.$ii] = isset($arrData['referrer_id_'.($ii-$i)])?$arrData['referrer_id_'.($ii-$i)]:0;
                    }
                    $v['referrer_id_'.$i] = $intUserId;
                    break;
                }
            }
            $intNum = 999;//默认999位置后面的为0
            for($i=1;$i<=10;$i++){
                if ($i > $intNum){
                    $v['referrer_id_'.$i] = 0;
                    continue;
                }
                if ($v['referrer_id_'.$i] == $intMasterId){
                    $intNum = $i;
                }
            }
            //重写了所有的层级，但user_name不变
            $options = Array('where'=>Array('user_id'=>$v['user_id'],));
            $result = $this->Db()->update('member_relations',$v,$options);
            if ($result === false){
                $this->Db()->rollback();
                return Array('推荐关系修改失败:'.$v['user_id']);
            }
        }
        $intNum = 999;//默认999位置后面的为0
        for($i=1;$i<=10;$i++){
            if ($i > $intNum){
                $arrData['referrer_id_'.$i] = 0;
                continue;
            }
            if ($arrData['referrer_id_'.$i] == $intMasterId){
                $intNum = $i;
            }
        }
        $options = Array('where'=>Array('user_id'=>$intUserId,),);
        $result = $this->Db()->update('member_relations',$arrData,$options);
        if ($result === false){
            $this->Db()->rollback();
            return Array('推荐关系修改失败:'.$intUserId);
        }
        $this->Db()->commit('Recommend.update');
        return Array('更新成功',1);
    }

    /**
     * 删除一个推荐关系
     * @param $intUserId
     * @return array
     */
    public function delete($intUserId){


        return Array('删除成功',1);
    }

}